package com.sx.sx1.lintcode.day717;

public class LC203 {


      static class SegmentTreeNode {
          public int start, end, max;
          public SegmentTreeNode left, right;
          public SegmentTreeNode(int start, int end, int max) {
              this.start = start;
              this.end = end;
              this.max = max;
              this.left = this.right = null;
          }
      }


    static class Solution {
        /**
         * @param root: The root of segment tree.
         * @param index: index.
         * @param value: value
         * @return: nothing
         */
        public void modify(SegmentTreeNode root, int index, int value) {
            if(root.start == root.end){
                root.max = value;
                return;
            }

            int m = root.start+(root.end-root.start)/2;
            if(m>= index){
                modify(root.left,index,value);
            }else{
                modify(root.right,index,value);
            }

            root.max = Math.max(root.left.max,root.right.max);
        }
    }

    public static void main(String[] args) {

    }
}


/*
LintCode-Logo
学习
刷题
题集
群组
内推
VIP
CAT
其他...
搜索题目、标签、题集
邀请有礼
中文
avatar
203 · 线段树的修改
算法
中等
通过率
46%
题目
题解8
笔记99+
讨论1
排名
记录
描述
对于一棵 最大线段树, 每个节点包含一个额外的 max 属性，用于存储该节点所代表区间的最大值。

设计一个 modify 的方法，接受三个参数 root、 index 和 value。该方法将 root 为根的线段树中 [start, end] = [index, index] 的节点修改为新的 value ，并确保在修改后，线段树的每个节点的 max 属性仍然具有正确的值。

面经攻略首曝光！
字节、阿里、亚麻《面试常考算法模板》

微信添加【jiuzhang1104】备注【常考】即可获得


在做此题前，最好先完成线段树的构造和 线段树查询这两道题目。

样例
样例 1:

输入："[1,4,max=3][1,2,max=2][3,4,max=3][1,1,max=2][2,2,max=1][3,3,max=0][4,4,max=3]",2,4
输出："[1,4,max=4][1,2,max=4][3,4,max=3][1,1,max=2][2,2,max=4][3,3,max=0][4,4,max=3]"
解释：
线段树:

	                      [1, 4, max=3]
	                    /                \
	        [1, 2, max=2]                [3, 4, max=3]
	       /              \             /             \
	[1, 1, max=2], [2, 2, max=1], [3, 3, max=0], [4, 4, max=3]

如何调用modify(root, 2, 4), 可以得到:

	                      [1, 4, max=4]
	                    /                \
	        [1, 2, max=4]                [3, 4, max=3]
	       /              \             /             \
	[1, 1, max=2], [2, 2, max=4], [3, 3, max=0], [4, 4, max=3]
样例 2:

输入："[1,4,max=3][1,2,max=2][3,4,max=3][1,1,max=2][2,2,max=1][3,3,max=0][4,4,max=3]",4,0
输出："[1,4,max=4][1,2,max=4][3,4,max=0][1,1,max=2][2,2,max=4][3,3,max=0][4,4,max=0]"
解释：
线段树:

	                      [1, 4, max=3]
	                    /                \
	        [1, 2, max=2]                [3, 4, max=3]
	       /              \             /             \
	[1, 1, max=2], [2, 2, max=1], [3, 3, max=0], [4, 4, max=3]
如果调用modify(root, 4, 0), 可以得到:

	                      [1, 4, max=2]
	                    /                \
	        [1, 2, max=2]                [3, 4, max=0]
	       /              \             /             \
	[1, 1, max=2], [2, 2, max=1], [3, 3, max=0], [4, 4, max=0]
挑战
时间复杂度 O(h) , h 是线段树的高度

标签
相关题目

201
线段树的构造
中等

202
线段树的查询
中等

247
线段树查询 II
中等
推荐课程

Twitter 后端系统 - Python 项目实战
从0项目经验到深度后端项目操盘，FB架构师万行代码还原真实开发环境，14周简历镀金
已开启智能提示
发起考试
30 分 00 秒
12345678910111213141516171819202122232425
/**
 * Definition of SegmentTreeNode:
 * public class SegmentTreeNode {
 *     public int start, end, max;
 *     public SegmentTreeNode left, right;
 *     public SegmentTreeNode(int start, int end, int max) {
 *         this.start = start;
 *         this.end = end;
 *         this.max = max
 *         this.left = this.right = null;

控制台
历史提交

 */
